/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package model.cliente;

import java.util.List;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import model.excecoes.ErroDAOException;
import model.excecoes.ErroNegocioException;
import model.interfaces.INegocioCliente;
import model.factory.Factory;

/**
 *
 * @author Marcos
 */
public class NegocioCliente implements INegocioCliente {

    private RepositorioCliente repCliente = null;

    public NegocioCliente() {
        repCliente = Factory.getClienteDAO();
    }

    private boolean verificarExistencia(String cpf) throws ErroDAOException, PersistenceException, NoResultException {
        return repCliente.verificarExistencia(cpf);
    }

    @Override
    public void cadastrarCliente(Cliente cliente) throws ErroDAOException, ErroNegocioException, PersistenceException, NoResultException {

        if (verificarExistencia(cliente.getCpf())) {
            throw new ErroNegocioException("Cliente já cadastrado.\nPor favor, insira os dados corretos ou cancele a operação.");
        }

        //Verificando se o campo está vazio.
        if (cliente.getNome().equals("")) {
            throw new ErroNegocioException("O Campo Nome é um campo obritatório portanto não pode ficar vazio.");
        }

        //Verificar se a quantidade de caracteres está dentro do permitido.
        if (cliente.getNome().length() > 300) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Nome só aceita até 300 caracteres.");
        }

        if (cliente.getEndereco().getRua().equals("")) {
            throw new ErroNegocioException("O Campo Rua é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getEndereco().getRua().length() > 300) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Rua só aceita até 300 caracteres.");
        }

        if (cliente.getEndereco().getCidade().equals("")) {
            throw new ErroNegocioException("O Campo Cidade é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getEndereco().getCidade().length() > 200) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Cidade só aceita até 200 caracteres.");
        }

        if (cliente.getEndereco().getBairro().equals("")) {
            throw new ErroNegocioException("O Campo Bairro é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getEndereco().getBairro().length() > 100) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Bairro só aceita até 100 caracteres.");
        }

        if (cliente.getEndereco().getCep().equals("")) {
            throw new ErroNegocioException("O Campo CEP é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getEndereco().getCep().length() > 20) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo CEP só aceita até 20 caracteres.");
        }

        if (cliente.getEndereco().getComplemento().equals("")) {
            throw new ErroNegocioException("O Campo Complemento é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getEndereco().getComplemento().length() > 300) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Complemento só aceita até 300 caracteres.");
        }

        if (cliente.getEndereco().getUf().equals("")) {
            throw new ErroNegocioException("O Campo UF é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getEndereco().getUf().length() > 70) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo UF só aceita até 70 caracteres.");
        }

        if (cliente.getRg().equals("")) {
            throw new ErroNegocioException("O Campo RG é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getRg().length() > 20) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo RG só aceita até 20 caracteres.");
        }

        if (cliente.getCpf().equals("")) {
            throw new ErroNegocioException("O Campo CPF é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getCpf().length() > 20) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo CPF só aceita até 20 caracteres.");
        }

        if (cliente.getLogin().equals("")) {
            throw new ErroNegocioException("O Campo Login é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getLogin().length() > 200) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Login só aceita até 200 caracteres.");
        }

        if (cliente.getSenha().equals("")) {
            throw new ErroNegocioException("O Campo Senha é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getSenha().length() > 200) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Senha só aceita até 200 caracteres.");
        }

        if (cliente.getContato().getTelefone().equals("")) {
            throw new ErroNegocioException("O Campo Telefone é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getContato().getTelefone().length() > 30) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Telefone só aceita até 30 caracteres.");
        }

        if (cliente.getContato().getCelular().equals("")) {
            throw new ErroNegocioException("O Campo Celular é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getContato().getCelular().length() > 30) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Celular só aceita até 30 caracteres.");
        }

        if (cliente.getContato().getEmail().equals("")) {
            throw new ErroNegocioException("O Campo E-Mail é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getContato().getEmail().length() > 100) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo E-Mail só aceita até 100 caracteres.");
        }

        if (!cliente.getContato().getEmail().contains("@") || !cliente.getContato().getEmail().contains(".")) {
            throw new ErroNegocioException("Formato de E-Mail inválido.\nO formato correto é: pessoa@people.com");
        }

        repCliente.cadastrar(cliente);

    }

    @Override
    public void alterarCliente(Cliente cliente) throws ErroDAOException, ErroNegocioException, PersistenceException, NoResultException {

        if (verificarExistencia(cliente.getCpf()) == false) {
            throw new ErroNegocioException("Cliente não encontrado.\nPor favor informe os dados corretos ou cancele a operação.");
        }

        //Verificando se o campo está vazio.
        if (cliente.getNome().equals("")) {
            throw new ErroNegocioException("O Campo Nome é um campo obritatório portanto não pode ficar vazio.");
        }

        //Verificar se a quantidade de caracteres está dentro do permitido.
        if (cliente.getNome().length() > 300) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Nome só aceita até 300 caracteres.");
        }

        if (cliente.getEndereco().getRua().equals("")) {
            throw new ErroNegocioException("O Campo Rua é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getEndereco().getRua().length() > 300) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Rua só aceita até 300 caracteres.");
        }

        if (cliente.getEndereco().getCidade().equals("")) {
            throw new ErroNegocioException("O Campo Cidade é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getEndereco().getCidade().length() > 200) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Cidade só aceita até 200 caracteres.");
        }

        if (cliente.getEndereco().getBairro().equals("")) {
            throw new ErroNegocioException("O Campo Bairro é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getEndereco().getBairro().length() > 100) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Bairro só aceita até 100 caracteres.");
        }

        if (cliente.getEndereco().getCep().equals("")) {
            throw new ErroNegocioException("O Campo CEP é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getEndereco().getCep().length() > 20) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo CEP só aceita até 20 caracteres.");
        }

        if (cliente.getEndereco().getComplemento().equals("")) {
            throw new ErroNegocioException("O Campo Complemento é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getEndereco().getComplemento().length() > 300) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Complemento só aceita até 300 caracteres.");
        }

        if (cliente.getEndereco().getUf().equals("")) {
            throw new ErroNegocioException("O Campo UF é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getEndereco().getUf().length() > 70) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo UF só aceita até 70 caracteres.");
        }

        if (cliente.getRg().equals("")) {
            throw new ErroNegocioException("O Campo RG é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getRg().length() > 20) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo RG só aceita até 20 caracteres.");
        }

        if (cliente.getCpf().equals("")) {
            throw new ErroNegocioException("O Campo CPF é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getCpf().length() > 20) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo CPF só aceita até 20 caracteres.");
        }

        if (cliente.getLogin().equals("")) {
            throw new ErroNegocioException("O Campo Login é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getLogin().length() > 200) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Login só aceita até 200 caracteres.");
        }

        if (cliente.getSenha().equals("")) {
            throw new ErroNegocioException("O Campo Senha é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getSenha().length() > 200) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Senha só aceita até 200 caracteres.");
        }

        if (cliente.getContato().getTelefone().equals("")) {
            throw new ErroNegocioException("O Campo Telefone é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getContato().getTelefone().length() > 30) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Telefone só aceita até 30 caracteres.");
        }

        if (cliente.getContato().getCelular().equals("")) {
            throw new ErroNegocioException("O Campo Celular é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getContato().getCelular().length() > 30) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Celular só aceita até 30 caracteres.");
        }

        if (cliente.getContato().getEmail().equals("")) {
            throw new ErroNegocioException("O Campo E-Mail é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (cliente.getContato().getEmail().length() > 100) {
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo E-Mail só aceita até 100 caracteres.");
        }

        if (!cliente.getContato().getEmail().contains("@") || !cliente.getContato().getEmail().contains(".")) {
            throw new ErroNegocioException("Formato de E-Mail inválido.\nO formato correto é: pessoa@people.com");
        }

        repCliente.alterar(cliente);
    }

    @Override
    public void excluirCliente(Cliente cliente) throws ErroDAOException, ErroNegocioException, PersistenceException, NoResultException {
        if (verificarExistencia(cliente.getCpf()) == false) {
            throw new ErroNegocioException("Cliente não encontrado.\nPor favor informe os dados corretos ou cancele a operação.");
        }

        repCliente.excluir(cliente);
    }

    @Override
    public List<Cliente> listarCliente(String consulta, String campo) throws ErroDAOException, ErroNegocioException, PersistenceException, NoResultException {
        List<Cliente> clientes = repCliente.listarCliente(campo, consulta);

        if (!consulta.equals("Todos") && !campo.equals("Todos")) {
            if (clientes.isEmpty()) {
                throw new ErroNegocioException("Cliente não cadastrado ou não encontrado.\nPor favor cadastre-se ou insira os dados corretos ou cancele a operação!");
            }
        }

        return clientes;
    }

    @Override
    public boolean logarCliente(String login, String senha) throws ErroDAOException, ErroNegocioException, PersistenceException, NoResultException {
        boolean logarCliente = repCliente.logarCliente(login, senha);

        if (login.equals("")) {
            throw new ErroNegocioException("O Campo Login é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (login.length() < 6 || senha.length() > 200) {
            throw new ErroNegocioException("O Campo Login não aceita quantidade de caracteres menor que 6 ou maior que 200.");
        }

        if (senha.equals("")) {
            throw new ErroNegocioException("O Campo Senha é um campo obrigatório portanto não pode ficar vazio.");
        }

        if (senha.length() < 6 || senha.length() > 200) {
            throw new ErroNegocioException("O Campo Senha não aceita quantidade de caracteres menor que 6 ou maior que 200.");
        }

        if (!logarCliente) {
            throw new ErroNegocioException("Login Inválido.\nTente novamente.");
        }

        return logarCliente;
    }

}
